#ifndef STACK_H
#define STACK_H
#include <iostream>
class StackNode;
using NodePtr = StackNode* ;


class StackNode{
public:
	NodePtr next;
	int val;
	StackNode(int value) : val(value) { }
	StackNode(NodePtr n = nullptr, int value = 0) : next(n), val(value){ }
};
class Stack {
public:
	Stack() : top(nullptr){ }
	~Stack(){ }
	
	//采用头插法
	void push(int);
	
	//出栈
	int pop();
	
	//判断栈是否为空
	bool isEmpty() const;
	
	//获取栈顶元素
	int getPeek() const;
	
	//获取栈的大小
	int getSize() const;
	
	//一次性清空栈
	void clear();
	
	//检查元素是否存在栈中
	bool checkElements(int) const;
	
	//拷贝栈
	static Stack copyStack(const Stack&);
	
	//打印栈
	void printStack() const;
	
	//反转栈
	void reverse();
	
	//从栈顶开始查找，返回步数
	int searchEelements(int);
private:
	NodePtr top;
	
};

#endif
